package com.sy.service;

/**
 * @className: AlipayService
 * @author: Mr.Liu
 * @date: 2025/11/11 16:34
 * @Version: 1.0
 * @description:
 */

import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.sy.config.AlipayConfig;
import com.sy.pojo.Orders;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 支付宝支付服务，处理生成二维码和查询支付状态
 */
@Service
@RequiredArgsConstructor // 自动注入依赖
public class AlipayService {

    private final AlipayClient alipayClient; // 支付宝客户端（从配置类注入）

    private final OrdersService ordersService; // 订单服务

    private final AlipayConfig alipayConfig; // 支付宝配置

    /**
     * 生成支付宝支付二维码（扫码支付）
     * @param userId 用户ID
     * @param courseId 课程ID
     * @param amount 支付金额
     * @param subject 订单标题（如"购买课程：Java入门"）
     * @return 二维码图片链接（支付宝返回）
     */
    public String createQrCode(Integer userId, Integer courseId, BigDecimal amount, String subject) throws Exception {
        // 1. 创建订单（在支付前先创建订单记录）
        Orders order = ordersService.createOrder(userId, courseId, amount);
        // 2. 构建支付宝请求参数
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        request.setNotifyUrl(alipayConfig.getNotifyUrl()); // 异步回调地址（支付后支付宝会调用此地址）

        // 3. 设置业务参数（JSON格式）
        String bizContent = "{" +
                "\"out_trade_no\":\"" + order.getOrderNumber() + "\"," + // 订单号（与本地订单一致）
                "\"total_amount\":\"" + amount + "\"," + // 支付金额（单位：元）
                "\"subject\":\"" + subject + "\"," + // 订单标题
                "\"timeout_express\":\"30m\"" + // 超时时间（30分钟未支付则关闭订单）
                "}";
        request.setBizContent(bizContent);

        // 4. 调用支付宝API生成二维码
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        if (response.isSuccess()) {
            return response.getQrCode(); // 返回二维码链接（前端可直接生成图片）
        } else {
            throw new RuntimeException("生成二维码失败：" + response.getMsg());
        }
    }

    /**
     * 查询支付状态
     * @param orderNumber 订单号
     * @return true=已支付，false=未支付
     */
    public boolean queryPayStatus(String orderNumber) throws Exception {
        // 1. 构建查询请求
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        String bizContent = "{" +
                "\"out_trade_no\":\"" + orderNumber + "\"" + // 订单号
                "}";
        request.setBizContent(bizContent);
        // 2. 调用支付宝API查询状态
        AlipayTradeQueryResponse response = alipayClient.execute(request);
        if (response.isSuccess()) {
            // 支付状态为"TRADE_SUCCESS"表示支付成功
            boolean isPaid = "TRADE_SUCCESS".equals(response.getTradeStatus());
            if (isPaid) {
                // 3. 支付成功则更新本地订单状态
                ordersService.updateToPaid(orderNumber);
            }
            return isPaid;
        }
        return false;
    }
}
